package com.linkgie.galaxyframework.crypto;

/**
 * 哈希操作；
 * 
 * @author liso
 *
 */
public interface HashFunc {

	/**
	 * 计算哈希摘要；
	 * 
	 * @param data 要计算哈希摘要的数据；
	 * @return
	 */
	HashCode hash(byte[] data);

	/**
	 * 计算哈希摘要；
	 * 
	 * @param data   要计算哈希摘要的数据；
	 * @param offset
	 * @param length
	 * @return
	 */
	HashCode hash(byte[] data, int offset, int length);

	/**
	 * 以原生模式计算哈希摘要；<p>
	 * 
	 * 等同于：<p>
	 * <code>
	 * {@link HashCode} hashCode = hash(data);
	 * return hashCode.getRaw();
	 * 
	 * </code>
	 * 
	 * @param data
	 * @return
	 */
	byte[] hashInRaw(byte[] data);

	/**
	 * 以原生模式计算哈希摘要；<p>
	 * 
	 * 等同于：<p>
	 * <code>
	 * {@link HashCode} hashCode = hash(data, offset, length);
	 * return hashCode.getRaw();
	 * 
	 * </code>
	 * 
	 * @param data
	 * @param offset
	 * @param length
	 * @return
	 */
	byte[] hashInRaw(byte[] data, int offset, int length);

	/**
	 * 以编码模式计算哈希摘要；
	 * <p>
	 * 
	 * 注：等效于调用 {@link #hash(byte[])} 方法返回之后再调用 {@link HashCode#getEncoded()} ，如下：
	 * <p>
	 * <code>
	 * {@link HashCode} hashCode = hash(data);<br>
	 * return hashCode.getEncoded();
	 * </code>
	 * 
	 * @param data 要计算哈希摘要的数据；
	 * @return
	 */
	byte[] hashInEncoded(byte[] data);

	/**
	 * 以编码模式计算哈希摘要；
	 * <p>
	 * 注：等效于调用 {@link #hash(byte[])} 方法返回之后再调用 {@link HashCode#getEncoded()} ，如下：
	 * <p>
	 * <code>
	 * {@link HashCode} hashCode = hash(data, offset, length);<br>
	 * return hashCode.getEncoded();
	 * </code>
	 * 
	 * @param data   要计算哈希摘要的数据；
	 * @param offset 数据的起始偏移量；
	 * @param length 数据的长度；
	 * @return
	 */
	byte[] hashInEncoded(byte[] data, int offset, int length);

}
